home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / Peter Lewis (TCPExample) / PNL Libraries / DNR.p next >
Encoding:
Text File  |  1995-12-11  |  7.8 KB  |  310 lines  |  [TEXT/CWIE]

  1. unit DNR;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types, TCPTypes;
  7.  
  8.     type
  9.         ResultProcPtr = UniversalProcPtr;
  10. { procedure ResultProc(hip:hostInfoPtr; userdata:ptr); }
  11.         ResultProc2Ptr = UniversalProcPtr;
  12. { procedure ResultProc2(hmxip:HMXInfoPtr; userdata:ptr); }
  13.         EnumResultProcPtr = UniversalProcPtr;
  14. { procedure EnumResultProc(cerp:cacheEntryRecordPtr; userdata:ptr); }
  15.  
  16.     function OpenResolver: OSErr;
  17.     procedure CloseResolver;
  18.     function StrToAddr (host: Str255; var rtnStruct: hostInfo; completion: ResultProcPtr; userdata: Ptr): OSErr;
  19.     procedure AddrToStr (addr: longint; var s: Str255);
  20.     function EnumCache (completion: EnumResultProcPtr; userdata: ptr): OSErr;
  21.     function AddrToName (addr: longint; var hi: hostInfo; completion: ResultProcPtr; userdata: ptr): OSErr;
  22.     function HInfo (host: Str255; var hi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  23.     function MXInfo (host: Str255; var mxi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  24.  
  25. implementation
  26.  
  27.     uses
  28.         Resources, Errors, Memory, MixedMode, Files, Folders, 
  29.         MyCallProc, MyCStrings;
  30.  
  31.     const
  32.         kOPENRESOLVER = 1;
  33.         kCLOSERESOLVER = 2;
  34.         kSTRTOADDR = 3;
  35.         kADDRTOSTR = 4;
  36.         kENUMCACHE = 5;
  37.         kADDRTONAME = 6;
  38.         kHINFO = 7;
  39.         kMXINFO = 8;
  40.         
  41.     var
  42.         code: Handle;
  43.  
  44.     procedure GetSystemFolder (var vrn: integer; var dirID: longint);
  45.     begin
  46.         if FindFolder(kOnSystemDisk, kSystemFolderType, false, vrn, dirID) <> noErr then begin
  47.             vrn := 0;
  48.             dirID := 0;
  49.         end;
  50.     end;
  51.  
  52.     procedure GetCPanelFolder (var vrn: integer; var dirID: longint);
  53.     begin
  54.         if FindFolder(kOnSystemDisk, kControlPanelFolderType, false, vrn, dirID) <> noErr then begin
  55.             vrn := 0;
  56.             dirID := 0;
  57.         end;
  58.     end;
  59.  
  60. { SearchFolderForDNRP is called to search a folder for files that might }
  61. { contain the 'dnrp' resource }
  62.     function SearchFolderForDNRP (ftype, fcreator: OSType; vrn: integer; dirID: longint): Handle;
  63.         var
  64.             pb: HParamBlockRec;
  65.             filename: Str63;
  66.             refnum: integer;
  67.             i: integer;
  68.             hhhh: Handle;
  69.             err: OSErr;
  70.     begin
  71.         hhhh := nil;
  72.         i := 1;
  73.         repeat
  74.             pb.ioNamePtr := @filename;
  75.             pb.ioVRefNum := vrn;
  76.             pb.ioDirID := dirID;
  77.             pb.ioFDirIndex := i;
  78.             i := i + 1;
  79.             err := PBHGetFInfoSync(@pb);
  80.             if err = noErr then begin
  81.                 if (pb.ioFlFndrInfo.fdType = ftype) & (pb.ioFlFndrInfo.fdCreator = fcreator) then begin
  82.                     SetResLoad(false);
  83.                     refnum := HOpenResFile(vrn, dirID, filename, fsRdPerm);
  84.                     SetResLoad(true);
  85.                     if refnum <> -1 then begin
  86.                         hhhh := Get1IndResource('dnrp', 1);
  87.                         if hhhh <> nil then begin
  88.                             DetachResource(hhhh);
  89.                         end;
  90.                         CloseResFile(refnum);
  91.                     end;
  92.                 end;
  93.             end;
  94.         until (err <> noErr) or (hhhh <> nil);
  95.         SearchFolderForDNRP := hhhh;
  96.     end;
  97.  
  98.     function SearchForDNRP: Handle;
  99.         var
  100.             hhhh: Handle;
  101.             vrn: integer;
  102.             dirID: longint;
  103.     begin
  104. { first search Control Panels for MacTCP 1.1 }
  105.         GetCPanelFolder(vrn, dirID);
  106.         hhhh := SearchFolderForDNRP('cdev', 'ztcp', vrn, dirID);
  107.  
  108.         if hhhh = nil then begin
  109. { next search System Folder for MacTCP 1.0.x }
  110.             GetSystemFolder(vrn, dirID);
  111.             hhhh := SearchFolderForDNRP('cdev', 'mtcp', vrn, dirID);
  112.         end;
  113.  
  114.         if hhhh = nil then begin
  115. { then search Control Panels for MacTCP 1.0.x }
  116.             GetCPanelFolder(vrn, dirID);
  117.             hhhh := SearchFolderForDNRP('cdev', 'mtcp', vrn, dirID);
  118.         end;
  119.  
  120.         if hhhh = nil then begin
  121. { finally, look in any open resource file }
  122.             hhhh := Get1IndResource('dnrp', 1);
  123.             if hhhh <> nil then begin
  124.                 DetachResource(hhhh);
  125.             end;
  126.         end;
  127.  
  128.         SearchForDNRP := hhhh;
  129.     end;
  130.  
  131.     function CallOpenResolver: OSErr;
  132.         var
  133.             proc:UniversalProcPtr;
  134.     begin
  135.         proc:=New68kProc(code^,uppC244ProcInfo);
  136.         CallOpenResolver := CallC244(nil, kOPENRESOLVER,proc);
  137.         DisposeRoutineDescriptor(proc);
  138.     end;
  139.  
  140.     function OpenResolver: OSErr;
  141.         var
  142.             err: OSErr;
  143.     begin
  144.         code := SearchForDNRP;
  145.         if code = nil then begin
  146.             err := resNotFound;
  147.         end else begin
  148.             HLock(code);
  149.             err := CallOpenResolver;
  150.             if err <> noErr then begin
  151.                 DisposeHandle(code);
  152.                 code := nil;
  153.             end;
  154.         end;
  155.         OpenResolver := err;
  156.     end;
  157.  
  158.     function CallCloseResolver:OSErr;
  159.         var
  160.             proc:UniversalProcPtr;
  161.     begin
  162.         proc:=New68kProc(code^,uppC24ProcInfo);
  163.         CallCloseResolver := CallC24(kCLOSERESOLVER,proc);
  164.         DisposeRoutineDescriptor(proc);
  165.     end;
  166.  
  167.     procedure CloseResolver;
  168.         var
  169.             junk:OSErr;
  170.     begin
  171.         if code <> nil then begin
  172.             junk:=CallCloseResolver;
  173.             DisposeHandle(code);
  174.         end;
  175.     end;
  176.  
  177.     function CallStrToAddr (cname: CStringPtr; var rtnStruct: hostInfo; completion: ResultProcPtr; userdata: ptr): OSErr;
  178.         var
  179.             proc:UniversalProcPtr;
  180.     begin
  181.         proc:=New68kProc(code^,uppC244444ProcInfo);
  182.         CallStrToAddr := CallC244444(userdata,completion,@rtnStruct,cname,kSTRTOADDR,proc);
  183.         DisposeRoutineDescriptor(proc);
  184.     end;
  185.  
  186.     function StrToAddr (host: Str255; var rtnStruct: hostInfo; completion: ResultProcPtr; userdata: Ptr): OSErr;
  187.         var
  188.             err: OSErr;
  189.     begin
  190.         if code = nil then begin
  191.             err := notOpenErr;
  192.         end else begin
  193.             P2C(@host);
  194.             err := CallStrToAddr(@host, rtnStruct, completion, userdata);
  195.         end;
  196.         StrToAddr := err;
  197.     end;
  198.  
  199.     function CallAddrToStr(addr: longint; cstr: CStringPtr):OSErr;
  200.         var
  201.             proc:UniversalProcPtr;
  202.     begin
  203.         proc:=New68kProc(code^,uppC2444ProcInfo);
  204.         CallAddrToStr := CallC2444(cstr, addr, kADDRTOSTR, proc);
  205.         DisposeRoutineDescriptor(proc);
  206.     end;
  207.  
  208.     procedure AddrToStr (addr: longint; var s: Str255);
  209.         var
  210.             junk:OSErr;
  211.             len: integer;
  212.     begin
  213.         if code <> nil then begin
  214.             junk := CallAddrToStr(addr, @s);
  215.             len := 0;
  216.             while (s[len] <> chr(0)) & (len < 255) do begin
  217.                 len := len + 1;
  218.             end;
  219.             BlockMoveData(@s, @s[1], len);
  220.             s[0] := chr(len);
  221.         end;
  222.     end;
  223.  
  224.     function CallEnumCache (completion: EnumResultProcPtr; userdata: ptr): OSErr;
  225.         var
  226.             proc:UniversalProcPtr;
  227.     begin
  228.         proc:=New68kProc(code^,uppC2444ProcInfo);
  229.         CallEnumCache := CallC2444(userdata, completion, kENUMCACHE, proc);
  230.         DisposeRoutineDescriptor(proc);
  231.     end;
  232.  
  233.     function EnumCache (completion: EnumResultProcPtr; userdata: ptr): OSErr;
  234.         var
  235.             err: OSErr;
  236.     begin
  237.         if code = nil then begin
  238.             err := notOpenErr;
  239.         end else begin
  240.             err := CallEnumCache(completion, userdata);
  241.         end;
  242.         EnumCache := err;
  243.     end;
  244.  
  245.     function CallAddrToName (addr: longint; var hi: hostInfo; completion: ResultProcPtr; userdata: ptr): OSErr;
  246.         var
  247.             proc:UniversalProcPtr;
  248.     begin
  249.         proc:=New68kProc(code^,uppC244444ProcInfo);
  250.         CallAddrToName := CallC244444(userdata, completion, @hi, addr, kADDRTONAME, proc);
  251.         DisposeRoutineDescriptor(proc);
  252.     end;
  253.  
  254.     function AddrToName (addr: longint; var hi: hostInfo; completion: ResultProcPtr; userdata: ptr): OSErr;
  255.         var
  256.             err: OSErr;
  257.     begin
  258.         if code = nil then begin
  259.             err := notOpenErr;
  260.         end else begin
  261.             err := CallAddrToName(addr, hi, completion, userdata);
  262.         end;
  263.         AddrToName := err;
  264.     end;
  265.  
  266.     function CallHInfo (name: CStringPtr; var hi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  267.         var
  268.             proc:UniversalProcPtr;
  269.     begin
  270.         proc:=New68kProc(code^,uppC244444ProcInfo);
  271.         CallHInfo := CallC244444(userdata, completion, @hi, @name, kHINFO, proc);
  272.         DisposeRoutineDescriptor(proc);
  273.     end;
  274.  
  275.     function HInfo (host: Str255; var hi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  276.         var
  277.             err: OSErr;
  278.     begin
  279.         if code = nil then begin
  280.             err := notOpenErr;
  281.         end else begin
  282.             P2C(@host);
  283.             err := CallHInfo(@host, hi, completion, userdata);
  284.         end;
  285.         HInfo := err;
  286.     end;
  287.  
  288.     function CallMXInfo (name: CStringPtr; var hi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  289.         var
  290.             proc:UniversalProcPtr;
  291.     begin
  292.         proc:=New68kProc(code^,uppC244444ProcInfo);
  293.         CallMXInfo := CallC244444(userdata, completion, @hi, @name, kMXINFO, proc);
  294.         DisposeRoutineDescriptor(proc);
  295.     end;
  296.  
  297.     function MXInfo (host: Str255; var mxi: hmxInfoRec; completion: ResultProc2Ptr; userdata: ptr): OSErr;
  298.         var
  299.             err: OSErr;
  300.     begin
  301.         if code = nil then begin
  302.             err := notOpenErr;
  303.         end else begin
  304.             P2C(@host);
  305.             err := CallMXInfo(@host, mxi, completion, userdata);
  306.         end;
  307.         MXInfo := err;
  308.     end;
  309.  
  310. end.